Cookie與session是web開發常需要使用的玩意
先來個cookie的範例程式
package main
import (
"fmt"
"net/http"
)
func setCookie(w http.ResponseWriter, r *http.Request) {
c := http.Cookie{
Name: "username",
Value: "Tom",
HttpOnly: true,
}
http.SetCookie(w, &c)
}
func getCookie(w http.ResponseWriter, r *http.Request) {
c, err := r.Cookie("username")
if err != nil {
fmt.Fprintln(w, "Cannot get cookie")
}
fmt.Fprintln(w, c)
}
func indexHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello world")
}
func main() {
http.HandleFunc("/", indexHandler)
http.HandleFunc("/cookie/set", setCookie)
http.HandleFunc("/cookie/get", getCookie)
http.ListenAndServe("localhost:8000", nil)
}
範例中大致設定該cookie的name,所對應的value,以及設定HttpOnly,其實最好還是要設定其存活時間也會比較好
能設定的參數如下
type Cookie struct {
Name string
Value string
Path string // optional
Domain string // optional
Expires time.Time // optional
RawExpires string // for reading cookies only
// MaxAge=0 means no 'Max-Age' attribute specified.
// MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
// MaxAge>0 means Max-Age attribute present and given in seconds
MaxAge int
Secure bool
HttpOnly bool
SameSite SameSite
Raw string
Unparsed []string // Raw text of unparsed attribute-value pairs
}
Name/Value: Cookie的名稱和值
Path: 可以將Cookie限定在某個路徑下,只有這個路徑和它的子路徑才可以訪問。
Domain: 只關聯的web伺服器的Domain, 比如example.com。如果你設置的Cookie的domain為a.example.com,那麼訪問b.example.com的時候是不能訪問這個Cookie的。
Expires: 為Cookie過期時間,Cookie超過這個時間點就會被刪除了。
RawExpires: Expires字串表示, 格式為Wdy, DD Mon YYYY HH:MM:SS或者Wdy, DD Mon YY HH:MM:SS
MaxAge: 最大存活時間。
Secure:設置 Cookie 只在HTTPS的請求中才會作用。
HttpOnly:跟安全性有關,建議true。
SameSite: 跟Chrome有關,主要是在處理跨域的安全問題。
備註:
這邊要特別注意ListenAndServe的位置,如果在HandleFunc之前的話,會導致該路由吃不到唷,所以如果範例跑失敗的話,建議注意一下這個部分
HttpOnly
這個部分是建議使用true,當 cookie 有設定 HttpOnly tue時,瀏覽器會限制 cookie 只能經由 HTTP(S) 協定來存取。因此當網站被 XSS 攻擊時,我們有把 cookie HttpOnly設定為true,這樣一來xss就無法直接透過 JavaScript 來盜取 cookie。
Session本來想一起拚完的,但真的累了~改天吧!!!!!